#!/bin/bash

# 备份路径
BACKUP_DIR=
#数据库IP
DB_HOST=
#数据库端口
DB_PORT=
#数据库账号
DB_USER=
#密码
DB_PASS=
#备份对象前缀
BACKUP_PREFIXS=

function usage() {
   echo "控制脚本"
   echo
   echo "Usage: "
   echo "  ./mysql-backup [COMMAND]"
   echo "  ./mysql-backup --help"
   echo
   echo "Commands: "
   echo " mysql-backup backup       备份数据库"
   echo " mysql-backup recover      恢复数据库"
}

function backup(){

    # 使用 test 命令或 [ ] 进行判断
    if [ -d "$BACKUP_DIR" ]; then
        echo "$BACKUP_DIR 目录存在，将清空目录"
        rm -rf $BACKUP_DIR/*.sql
    else
        mkdir $BACKUP_DIR
    fi

    IFS="/" read -ra parts <<< "$BACKUP_PREFIXS"

    
    for part in "${parts[@]}"; do
        echo "开始备份前缀: $part"

        # 查询数据库名
        DATABASES=($(mysql -u"$DB_USER" -p"$DB_PASS" -h"$DB_HOST" -P"$DB_PORT" -e "SHOW DATABASES LIKE '$part%';" | grep -v Database))

        # 获取当前日期
        CURRENT_DATE=$(date +%Y%m%d)

        # 循环备份每个数据库
        for DB_NAME in "${DATABASES[@]}"; do
            echo "开始备份 $DB_NAME 数据库"
            # 备份文件名
            BACKUP_FILE="${DB_NAME}@${CURRENT_DATE}.sql"
            # 执行备份命令
            mysqldump  --single-transaction --set-gtid-purged=off -u"$DB_USER" -p"$DB_PASS" -h"$DB_HOST" -P"$DB_PORT" "$DB_NAME" > "$BACKUP_DIR/$BACKUP_FILE"
            # 检查备份是否成功
            if [ $? -eq 0 ]; then
                echo "备份 $DB_NAME 数据库成功，备份文件保存为 $BACKUP_FILE"
            else
                echo "备份 $DB_NAME 数据库失败"
            fi
        done
    done    
    echo "执行结束"
}

function recover(){
    
    # 恢复所有备份文件 循环遍历备份文件
    for backup_file in "$BACKUP_DIR"/*.sql; do
        # 提取数据库名
        db_name=$(basename "$backup_file" | cut -d '@' -f 1)
        echo "准备恢复数据库：$db_name,检查数据库是否存在"
        
        # 检查数据库是否存在
        db_exist=$(mysql -u"$DB_USER" -p"$DB_PASS" -h"$DB_HOST" -P"$DB_PORT" -e "SHOW DATABASES LIKE '$db_name';" | grep "$db_name")
        
        # 如果数据库不存在，则创建数据库
        if [ -z "$db_exist" ]; then
            echo "数据库不存在，自动创建数据库 $db_name"
            mysql -u"$DB_USER" -p"$DB_PASS" -h"$DB_HOST" -P"$DB_PORT" -e "CREATE DATABASE \`$db_name\`;"
        fi

        # 恢复数据库
        echo "恢复数据库 $db_name"
        mysql -u"$DB_USER" -p"$DB_PASS" -h"$DB_HOST" -P"$DB_PORT" "$db_name" < "$backup_file"
    done
    echo "执行结束"
}


function main() {
    # MySQL 连接信息
    read -p "***********输入备份目录 [默认:/var/lib/mysql/backup/data]:" INPUT_BACKUP_DIR
    read -p "***********输入连接的数据库IP [默认:localhost]:" INPUT_DB_HOST
    read -p "***********输入连接的数据库端口 [默认:3306]:" INPUT_DB_PORT
    read -p "***********输入连接的数据库账号 [默认:root]:" INPUT_DB_USER
    read -p "***********输入连接的数据库密码:" INPUT_DB_PASS

    if [ -z "$INPUT_BACKUP_DIR" ]; then
        INPUT_BACKUP_DIR="/var/lib/mysql/backup/data"
    fi
    if [ -z "$INPUT_DB_HOST" ]; then
        INPUT_DB_HOST="localhost"
    fi
    if [ -z "$INPUT_DB_PORT" ]; then
        INPUT_DB_PORT="3306"
    fi
    if [ -z "$INPUT_DB_USER" ]; then
        INPUT_DB_USER="root"
    fi
    BACKUP_DIR=$INPUT_BACKUP_DIR
    DB_HOST=$INPUT_DB_HOST
    DB_PORT=$INPUT_DB_PORT
    DB_USER=$INPUT_DB_USER
    DB_PASS=$INPUT_DB_PASS
    
    read -p "***********请选择执行动作 [b:备份  r:还原]:" OPERATE



    case "${OPERATE}" in
      b)
         echo ""
         echo "支持批量备份数据库："
         echo "   1、根据输入的内容进行前缀匹配，例如：demo_  可匹配所有以demo_开头的数据库"
         echo "   2、支持多个前缀匹配，例如：demo_/test_  可匹配所有以demo_和test_开头的数据库"
         echo ""
         # 备份数据库名前缀
         read -p "***********输入需要备份的数据库:" INPUT_BACKUP_PREFIXS
         BACKUP_PREFIXS=$INPUT_BACKUP_PREFIXS

         backup > backup.log 2>&1 &
         sleep 2
         tail -200f backup.log
         ;;
      r)
         recover > recover.log 2>&1 &
         sleep 2
         tail -200f recover.log
         ;;
      help)
         usage
         ;;
      --help)
         usage
         ;;
      *)
         echo "不支持的参数，请使用 help 或 --help 参数获取帮助"
    esac
}
main